package com.darwin.darwinImage.darx
{
	import com.darwin.darwinDisplay.BitmapFilterList;
	import com.darwin.darwinDisplay.DarXBitmapData;
	
	import flash.display.BitmapData;
	import flash.filters.BitmapFilter;
	import flash.geom.Matrix;
	import flash.utils.ByteArray;

	/**
	 *	DarX文件编/解码静态类 
	 * @author Roland
	 * 
	 */
	public class DarX
	{
		private static var encoder:DarXEncoder;
		private static var decoder:DarXDecoder;
		
		public function DarX()
		{
			throw new Error("DarX为静态类，不允许实例化");
		}
		
		/**
		 *	合成传入的 darxBitmapData列表为单个动画序列
		 * @param darxBitmapDataList 要合成的列表
		 * @param callBack 合成完毕后的回调函数 function callBack(bitmapDataList:Array,frameOffsetList:Array【可以是Point或Rectangle列表】):void
		 * @param filtersList 要给列表中每部件单独应用的滤镜列表(可选)
		 * @param matrix 要对动画应用的矩阵变换
		 */
		public static function synthesis(darxBitmapDataList:Vector.<DarXBitmapData>,callBack:Function,filtersList:Vector.<BitmapFilterList> = null,matrix:Matrix = null):void
		{
			DarXSynthesizer.synthesis(darxBitmapDataList,callBack,filtersList,matrix);
		}
		
		/**
		 * 将传入动画帧和对应的深度贴图编码为.darx文件的二进制数据
		 * @param darXDataList 携带深度的贴图动画数据列表
		 * @param quality 动画帧图像的编码质量，值越大质量越好，产生的文件越大(0~100)
		 * @return darx文件的二进制数据
		 */		
		public static function encode(darXDataList:Vector.<DarXBitmapData>,quality:int = 70):ByteArray
		{
			if(encoder == null)
			{
				encoder = new DarXEncoder();
			}
			return encoder.encode(darXDataList,quality);
		}
		
		/**
		 *	将.darx文件的二进制数据解码为DarXBitmapData(异步过程)
		 * @param bytes
		 * @param callBack 解析完成后的回调 callBack(list:Vector.<DarXBitmapData>);
		 * @param fullDecode 是否完整解析，如果为false则将只填充darxBitmapData中每帧的二进制数据，
		 * 而不会将其解析为位图，当要使用时再次调用decodeDarXBitmapData来完整解析单个DarXBitmapData。
		 * @return 
		 */
		public static function decode(bytes:ByteArray,callBack:Function,fullDecode:Boolean=true):void
		{
			if(decoder == null)
			{
				decoder = new DarXDecoder();
			}
			decoder.decode(bytes,callBack,fullDecode);
		}
		
		/**
		 *	将.swf文件的二进制数据解析为DarXBitmapData(异步过程，不包含深度贴图信息) 
		 * @param swfbytes
		 * @param callBack 解析完成后的回调 callBack(list:Vector.<DarXBitmapData>);
		 * 
		 */
		public static function decodeSwf(swfbytes:ByteArray,callBack:Function):void
		{
			if(decoder == null)
			{
				decoder = new DarXDecoder();
			}
			decoder.decodeSwf(swfbytes,callBack);
		}
		
		
//		public static function decodeImgSheet(matId:String,state:String,
		
		/**
		 *	完整解析单个DarxBitmapData ，此操作将填充darxBitmapData中的frameList和zMapList属性
		 * @param darxBitmapData
		 * @param callBack 解析完成后的回调 compFn(darX:DarXBitmapData):void;
		 * 
		 */
		public static function decodeDarXBitmapData(darxBitmapData:DarXBitmapData,callBack:Function):void
		{
			if(decoder == null)
			{
				decoder = new DarXDecoder();
			}
			decoder.decodeDarXBitmapData(darxBitmapData,callBack);
		}
		
		/**
		 *	完整解码一份darXBitmapData列表 
		 * @param darxList
		 * @param compFn 解码完成后的回调 compFn(darxList:Vector.<DarXBitmapData>):void;
		 */
		public static function decodeDarXBitmapDataList(darxList:Vector.<DarXBitmapData>,compFn:Function):void
		{
			if(decoder == null)
			{
				decoder = new DarXDecoder();
			}
			decoder.decodeDarXBitmapDataList(darxList,compFn);
		}
		
	}
}